#数值微分的例子（二维）
import numpy as np
import matplotlib.pyplot as plt

#定义二元二次函数y=x0*x0+x1*x1
def function_2(x):
    return x[0]**2 + x[1]**2  #或者return np.sum(x**2)

#固定x1=4，带入二元函数化成一元函数(先带后求法)
def function_tmp1(x0):
    return x0**2 + 4.0**2

#固定x0=3，带入二元函数化成一元函数(先带后求法)
def function_tmp2(x1):
    return 3.0**2 + x1**2

#定义数值微分函数
def numerical_diff(f, x):
    h = 1e-4  #0.0001
    return (f(x+h)-f(x-h)) / (2*h)

#求x0=3,x1=2的函数值
a = np.array([3, 2])
print(function_2(a))

#求x0=3,x1=4时，关于x0的偏导数
r0 = numerical_diff(function_tmp1, 3.0)
print(r0)

#求x0=3,x1=4时，关于x1的偏导数
r1 = numerical_diff(function_tmp2, 4.0)
print(r1)
